﻿using DeYi.NuGet.Json;
using DeYi.NuGet.Other;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace UploadVideoToQiniu
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.StartPosition = FormStartPosition.CenterScreen;
            this.MaximizeBox = false;
        }
        #region 获取文件类型
        //pszPath指向包含路径和文件名的最大长度MAX_PATH 以 null 结尾的字符串的指针。 绝对路径和相对路径均有效。
        //dwFileAttributes 一个或多个 文件属性标志 的组合， (FILE_ATTRIBUTE_ Winnt.h) 中定义的值。 如果 uFlags 不包含 SHGFI_USEFILEATTRIBUTES 标志，则忽略此参数。
        //psfi指向 SHFILEINFO 结构的指针，用于接收文件信息。
        //cbFileInfo psfi 参数指向的 SHFILEINFO 结构的大小（以字节为单位）。
        //uFlags指定要检索的文件信息的标志。 此参数可以是以下值的组合。
        //https://learn.microsoft.com/zh-cn/windows/win32/api/shellapi/nf-shellapi-shgetfileinfoa?redirectedfrom=MSDN
        [DllImport("shell32.dll", CharSet = CharSet.Auto)]
        public static extern int SHGetFileInfo(string pszPath, uint dwFileAttributes, out SHFILEINFO psfi, uint cbFileInfo, uint uFlags);
        //https://learn.microsoft.com/zh-cn/windows/win32/api/shellapi/ns-shellapi-shfileinfoa
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct SHFILEINFO
        {
            public IntPtr hIcon;//表示文件的图标的句柄。
            public int iIcon;//系统映像列表中的图标图像的索引。
            public uint dwAttributes;//一个值数组，指示文件对象的属性。
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string szDisplayName;//一个字符串，其中包含文件在 Windows Shell 中显示的名称，或包含表示该文件的图标的文件的路径和文件名。
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
            public string szTypeName;//描述文件类型的字符串。
        }
        //检索描述文件类型的字符串。 字符串将复制到 psfi 中指定的结构的 szTypeName 成员。
        public const uint SHGFI_TYPENAME = 0x000000400;
        //未设置其他属性的文件。 此属性仅在单独使用时才有效。
        //https://learn.microsoft.com/zh-cn/windows/win32/fileio/file-attribute-constants
        public const uint FILE_ATTRIBUTE_NORMAL = 0x00000080;
        static string GetFileTypeName(string filePath)
        {
            SHFILEINFO shfi = new SHFILEINFO();
            int ret = SHGetFileInfo(filePath, FILE_ATTRIBUTE_NORMAL, out shfi, (uint)Marshal.SizeOf(shfi),
                SHGFI_TYPENAME);

            if (ret != 0)
                return shfi.szTypeName;
            else
                return string.Empty;
        }
        #endregion

        #region 辅助方法
        static int _showTimes = 0;
        //主界面显示
        /// <summary>
        /// 显示消息方法
        /// </summary>
        /// <param name="strMeassge"></param>
        public static void gc_showMessage(string strMeassge, RichTextBox richTextBox1)
        {
            Action<string> del = delegate (string stMsg)
            {
                if (_showTimes > 100)
                {
                    _showTimes = 1;
                    richTextBox1.AppendText("");
                    richTextBox1.Clear();
                }
                _showTimes++;
                richTextBox1.AppendText("[" + DateTime.Now.ToString("hh:mm:ss") + "]：" + stMsg + Environment.NewLine);
                richTextBox1.SelectionStart = richTextBox1.TextLength;
                richTextBox1.ScrollToCaret();
            };
            richTextBox1.Invoke(del, strMeassge);
        }
        #endregion

        private void button2_Click(object sender, EventArgs e)
        {
            if (textBox1.Text.Trim().Length == 0) return;
            if (textBox1.Text == "deyishiping")
            {
                button1.Enabled = true;
                button2.Enabled = false;
                textBox1.Enabled = false;
            }
            else MessageBox.Show("密码错误", "提示");
        }

        private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e)
        {
            Uri uriResult;
            bool result = Uri.TryCreate(e.LinkText, UriKind.Absolute, out uriResult)
                || Uri.TryCreate(e.LinkText, UriKind.Relative, out uriResult);
            // Call Process.Start method to open a browser, with link text as URL
            var startInfo = new ProcessStartInfo(uriResult.ToString())
            {
                UseShellExecute = true
            };
            System.Diagnostics.Process.Start(startInfo);// call default browser
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openImageDialog = new OpenFileDialog();
            //openImageDialog.Filter = "Video Files (*.avi)|*.avi";
            openImageDialog.Multiselect = true;
            var QiniuAccessKey = "m4emCpnwPsbIhGnr7893jLzsi8Sv6TH5v5CY3GSW";// ConfigurationManager.AppSettings["Qiniu.AccessKey"];
            var QiniuSecretKey = "siwrVtBCHbKmDA2TbSYraSUmWuNNI4GBio4mzVgU";// ConfigurationManager.AppSettings["Qiniu.SecretKey"];
            var QiniuScope = "deyimarketing";// ConfigurationManager.AppSettings["Qiniu.Scope"];
            var QiniuBaseURL = "http://deyimarketing.deyi2020.com/";// ConfigurationManager.AppSettings["Qiniu.BaseURL"];
            var FileExts = ".avi|.wmv|.mpeg|.mp4|.m4v|.mov|.asf|.flv|.f4v|.rmvb|.rm|.3gp|.vob".Split('|').ToList();
            if (openImageDialog.ShowDialog() == DialogResult.OK)
            {
                var fileNames = openImageDialog.FileNames;
                Task.Factory.StartNew(() =>
                {
                    foreach (var item in fileNames)
                    {
                        string fileName = Path.GetFileName(item);
                        gc_showMessage(fileName + "上传中，请稍后...", richTextBox1);
                        string fileExtension = Path.GetExtension(item);
                        var desFileName = "Video_" + Guid.NewGuid().ToString() + fileExtension;
                        //var fileType = GetFileTypeName(item);
                        if (FileExts.Contains(fileExtension.ToLower()))
                        {
                            var uploadResult = QiniuHelper.QiniuUploadFile(item, desFileName, QiniuAccessKey, QiniuSecretKey, QiniuScope);
                            if (uploadResult.Data)
                            {
                                gc_showMessage(fileName + "上传成功，文件名为：" + QiniuBaseURL + desFileName, richTextBox1);
                                File.AppendAllText(AppDomain.CurrentDomain.BaseDirectory+"/upload.log", "[" + DateTime.Now.ToString("hh:mm:ss") + "]：" + fileName + "上传成功，文件名为：" + QiniuBaseURL + desFileName + Environment.NewLine);
                            }
                        }
                        else
                        {
                            gc_showMessage(fileName + "格式无效,目前仅支持以下格式：" + JsonHelper.Serialize(FileExts), richTextBox1);
                        }
                    }
                });
            }
        }
    }
}
